author-pic

Elli Jeon

[Javascript] Intersection Observer API (ft.react)


Published on September 13, 2021

Intersection Observer API (ft.react)

1. 개요

라매개발자님이 주최하신 팀 프로젝트 그룹에서 만난 팀원분들과 한 달여에 걸쳐 만든 여행지 소개 페이지 (instagram 같은)를 무사히(?) 만들어냈다! (사실 다 만든 것은 아니다... 오류도 많고 실사용자 피드백도 수정하지 않았으며 리팩토링하고 싶은 코드들도 많다.)

아무튼 나름의 마무리를 한 만큼 배우고, 기억해두고 싶은 것들을 정리해보기로 했다. 아직 다른 분들의 코드를 제대로 안 뜯어보았으므로 우선은 내가 이번에 배운 것을 하나 정리해보기로 했다.

이름하야 Lazy Loading!!!

인스타그램을 우리가 켜본다고 가정해보자. 정말 수 없이 많은 사진들이 내 컴퓨터 화면에 뜨게 될 것이다. 그런데 이 사진들을 그냥 한 번에 띄운다는 것은 매우 멍청한 생각이다. 첫 번째로는 시간이 오래 걸릴 것이며, 두 번째로는 트래픽이 너무 높아질 것이다. 그래서 등장한 아이디어가 바로 Lazy Loading이다. 사용자가 해당 사진에 접근하게 되면 (해당 아이템이 사용자의 화면에 나오게 되면) 그 때 서버에 사진을 요청하는 것이다!

이전에는 좀 다른 방법으로 lazy loading을 구현했다고 하는데... 그 방법이 너무 계산이 많아지고 그래서 효율이 안 좋다고 한다.; 그래서 나온 API가 바로 intersection observer API 다.

2. 사용방법

거두절미하고 사용 방법을 정리해보자. (react에서)

// 해당 page 에서
...

const lazyTarget = useRef() //우리가 관측할 대상이다.

useEffect(()=>{
  let observer;

  if(lazyTarget.current){ // ref안에 관측할 컴포넌트가 있어야 시작

    // new IntersectionObserver(fn, option) 1. observer에 IO 넣어줌
    observer = new IntersectionObserver((entries)=>{
      entries.forEach((entry)=>{
        if(entry.intersecting){ // 화면과 대상이 겹쳐지면
          //할 거 함 (ex. 사진 불러오는 axios);
          //setTimeOut(()=>(setIsView(true)),1000);
          //setTimeOut은 isview의 true false에 따라 로딩 중인 fake image가 보이고 말고가 결정. false일 때는 보이다가 여기서 true로 바꿔주었음.
        }
      })
    },{})

    observer.observe(); // 2. 대상 관측 시작
  }

  return ()=> observer && observer.disconnect(); // useEffect cleanup 함수  // 3. useEffect 끝내면서 observer있으면 지워줌

},[])



...


<Component ref = {lazyTarget}/>

3. 21.09.28 내용 추가

  const lazyTarget = useRef(null);

  useEffect(() => {
    const observer = new IntersectionObserver(
      (entries, observer) => {
        entries.forEach(entry => {
          if (entry.isIntersecting) {
            console.log(entry);
          }
        });
      },
      { threshold: 0.3 },
    );

    if (lazyTarget.current) {
      observer.observe(lazyTarget.current);
    }

    return () => observer && observer.disconnect();
  }, [lazyTarget]);

  //다음과 같이 작성하는 것이 더 깔끔하다

  //react-intersction-observer 라는 library가 있으니 활용해서 깔끔하게 코드 작성하자!

If you like it, share it!